home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / dist-packages / launchpadbugs / tasksbase.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  17.8 KB  |  419 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. from lphelper import change_obj, product, user, LateBindingProperty
  5. import re
  6. import urlparse
  7.  
  8. class LPTask(object):
  9.     """ The 'LPTask'-object represents on task of a bugreport
  10.     
  11.     * editable attributes:
  12.         .sourcepackage: lp-name of a package/project
  13.         .status: valid lp-status
  14.         .importance: valid lp-importance (if the user is not permitted to
  15.             change 'importance' an 'IOError' will be raised
  16.         .assignee: lp-login of an user/group
  17.         .milestone: value must be in '.valid_milestones'
  18.         
  19.     * read-only attributes:
  20.         .affects, .target, .valid_milestones
  21.         
  22.     TODO: * rename 'Info' into 'Task'
  23.     
  24.     Arguments
  25.         affects (h,t,rw)
  26.         status (h,t,rw)
  27.         importance (h,t,rw)
  28.         assignee (h,t,rw)
  29.         current
  30.         editurl
  31.         type
  32.         milestone
  33.         available_milestone
  34.         lock_importance
  35.         targeted_to
  36.         remote
  37.         editlock
  38.         edit_fields
  39.         connection
  40.         
  41.     Attributes:
  42.         sourcepackage
  43.         status
  44.         importance
  45.         assignee
  46.         milestone
  47.         targeted_to
  48.         remote
  49.         affects
  50.         target
  51.         valid_milestones
  52.         component
  53.     
  54.     """
  55.     
  56.     def __init__(self, value_dict = { }):
  57.         self._connection = value_dict.get('connection', None)
  58.         self._editlock = value_dict.get('editlock', True)
  59.         self._edit_fields = value_dict.get('edit_fields', set())
  60.         self._lock_importance = value_dict.get('lock_importance', False)
  61.         self._target = None
  62.         self._affects = value_dict.get('affects', product(None))
  63.         temp = self._affects.split(' ')
  64.         if temp[0] == 'Ubuntu':
  65.             self._sourcepackage = None
  66.         else:
  67.             self._sourcepackage = temp[0]
  68.         r = re.match('^.*\\((.*)\\)$', self._affects.longname)
  69.         if r:
  70.             self._target = r.group(1).lower()
  71.         
  72.         self._status = value_dict.get('status', None)
  73.         self._importance = value_dict.get('importance', None)
  74.         self._assignee = value_dict.get('assignee', user(None))
  75.         self._current = value_dict.get('current', None)
  76.         self._editurl = value_dict.get('editurl', None)
  77.         self._type = value_dict.get('type', None)
  78.         self._milestone = value_dict.get('milestone', None)
  79.         self._available_milestone = value_dict.get('available_milestone', { })
  80.         self._targeted_to = value_dict.get('targeted_to', None)
  81.         self._remote = value_dict.get('remote', None)
  82.         self._date_created = value_dict.get('date-created', None)
  83.         self._date_confirmed = value_dict.get('date-confirmed', None)
  84.         self._date_assigned = value_dict.get('date-assigned', None)
  85.         self._date_inprogress = value_dict.get('date-inprogress', None)
  86.         self._date_closed = value_dict.get('date-closed', None)
  87.         self._date_left_new = value_dict.get('date-left-new', None)
  88.         self._date_incomplete = value_dict.get('date-incomplete', None)
  89.         self._date_triaged = value_dict.get('date-triaged', None)
  90.         self._date_fix_committed = value_dict.get('date-fix-committed', None)
  91.         self._date_fix_released = value_dict.get('date-fix-released', None)
  92.         self._user = value_dict.get('reporter', user(None))
  93.         self._component = value_dict.get('component', None)
  94.         self._cache = { }
  95.  
  96.     
  97.     def __str__(self):
  98.         if not self._targeted_to or ' (%s)' % self._targeted_to:
  99.             pass
  100.         targeted_to = ''
  101.         if not self._remote or ' (remote)':
  102.             pass
  103.         remote = ''
  104.         if not self.affects.longname:
  105.             pass
  106.         return '[%s%s%s: %s/%s]' % (self.affects, targeted_to, remote, self.status, self.importance)
  107.  
  108.     
  109.     def __repr__(self):
  110.         if not self._targeted_to or ' (%s)' % self._targeted_to:
  111.             pass
  112.         targeted_to = ''
  113.         if not self._remote or ' (remote)':
  114.             pass
  115.         remote = ''
  116.         
  117.         try:
  118.             if not not (self._editlock) or self._editurl.split('/')[-2]:
  119.                 pass
  120.             number = self._editurl.split('/')[-1]
  121.         except AttributeError:
  122.             number = 'unknown'
  123.  
  124.         if not self.affects.longname:
  125.             pass
  126.         return "<Info of '%s%s%s (#%s)'>" % (self.affects, targeted_to, remote, number)
  127.  
  128.     
  129.     def is_current(self, current_task_tupel):
  130.         if current_task_tupel == (self.target, self.targeted_to, self.sourcepackage):
  131.             return True
  132.         return False
  133.  
  134.     
  135.     def get_date_created(self):
  136.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  137.  
  138.     date_created = LateBindingProperty(get_date_created)
  139.     
  140.     def get_date_confirmed(self):
  141.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  142.  
  143.     date_confirmed = LateBindingProperty(get_date_confirmed)
  144.     
  145.     def get_date_assigned(self):
  146.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  147.  
  148.     date_assigned = LateBindingProperty(get_date_assigned)
  149.     
  150.     def get_date_inprogress(self):
  151.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  152.  
  153.     date_inprogress = LateBindingProperty(get_date_inprogress)
  154.     
  155.     def get_date_closed(self):
  156.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  157.  
  158.     date_closed = LateBindingProperty(get_date_closed)
  159.     
  160.     def get_date_left_new(self):
  161.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  162.  
  163.     date_left_new = LateBindingProperty(get_date_left_new)
  164.     
  165.     def get_date_incomplete(self):
  166.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  167.  
  168.     date_incomplete = LateBindingProperty(get_date_incomplete)
  169.     
  170.     def get_date_triaged(self):
  171.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  172.  
  173.     date_triaged = LateBindingProperty(get_date_triaged)
  174.     
  175.     def get_date_fix_committed(self):
  176.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  177.  
  178.     date_fix_committed = LateBindingProperty(get_date_fix_committed)
  179.     
  180.     def get_date_fix_released(self):
  181.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  182.  
  183.     date_fix_released = LateBindingProperty(get_date_fix_released)
  184.     
  185.     def get_user(self):
  186.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  187.  
  188.     user = LateBindingProperty(get_user)
  189.     
  190.     def get_component(self):
  191.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  192.  
  193.     component = LateBindingProperty(get_component)
  194.     
  195.     def get_targeted_to(self):
  196.         return self._targeted_to
  197.  
  198.     targeted_to = LateBindingProperty(get_targeted_to)
  199.     
  200.     def get_remote(self):
  201.         return self._remote
  202.  
  203.     remote = LateBindingProperty(get_remote)
  204.     
  205.     def get_affects(self):
  206.         return self._affects
  207.  
  208.     affects = LateBindingProperty(get_affects)
  209.     
  210.     def get_target(self):
  211.         return self._target
  212.  
  213.     target = LateBindingProperty(get_target)
  214.     
  215.     def get_sourcepackage(self):
  216.         return self._sourcepackage
  217.  
  218.     
  219.     def set_sourcepackage(self, package):
  220.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  221.  
  222.     sourcepackage = LateBindingProperty(get_sourcepackage, set_sourcepackage, doc = 'sourcepackage of a bug')
  223.     
  224.     def get_assignee(self):
  225.         return self._assignee
  226.  
  227.     
  228.     def set_assignee(self, lplogin):
  229.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  230.  
  231.     assignee = LateBindingProperty(get_assignee, set_assignee, doc = 'assignee to a bugreport')
  232.     
  233.     def get_status(self):
  234.         return self._status
  235.  
  236.     
  237.     def set_status(self, status):
  238.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  239.  
  240.     status = LateBindingProperty(get_status, set_status, doc = 'status of a bugreport')
  241.     
  242.     def get_importance(self):
  243.         return self._importance
  244.  
  245.     
  246.     def set_importance(self, importance):
  247.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  248.  
  249.     importance = LateBindingProperty(get_importance, set_importance, doc = 'importance of a bugreport')
  250.     
  251.     def get_valid_milestones(self):
  252.         return self._available_milestone
  253.  
  254.     valid_milestones = LateBindingProperty(get_valid_milestones)
  255.     
  256.     def get_milestone(self):
  257.         return self._milestone
  258.  
  259.     
  260.     def set_milestone(self, milestone):
  261.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  262.  
  263.     milestone = LateBindingProperty(get_milestone, set_milestone, doc = 'milestone of a bugreport')
  264.     
  265.     def get_changed(self):
  266.         changed = set()
  267.         for k in self._cache:
  268.             if self._cache[k] != getattr(self, k):
  269.                 changed.add(k)
  270.                 continue
  271.         
  272.         return frozenset(changed)
  273.  
  274.     changed = property(get_changed, doc = 'get a list of changed attributes')
  275.     
  276.     def commit(self, force_changes = False, ignore_lp_errors = True):
  277.         """ Commits the local changes to launchpad.net
  278.         
  279.         * force_changes: general argument, has not effect in this case
  280.         * ignore_lp_errors: if the user tries to commit invalid data to launchpad,
  281.             launchpad returns an error-page. If 'ignore_lp_errors=False' Info.commit()
  282.             will raise an 'ValueError' in this case, otherwise ignore this
  283.             and leave the bugreport in launchpad unchanged (default=True)
  284.         """
  285.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  286.  
  287.  
  288.  
  289. class LPTasks(list):
  290.     """ The 'LPTasks'-object represents the tasks related to a bugreport
  291.         
  292.     * read-only attributes:
  293.         .current: returns the highlighted Info-object of the bugreport
  294.     
  295.     TODO:  * rename 'InfoTable' into 'TaskTable'
  296.            * allow adding of tasks (Also affects upstream/Also affects distribution)
  297.            * does current/tracked work as expected?
  298.            * remote: parse editable values
  299.     """
  300.     
  301.     def __init__(self, conf_data = { }):
  302.         self._current = None
  303.         self.parsed = False
  304.         self._url = conf_data.get('url', '')
  305.         self._xml = conf_data.get('xml', '')
  306.         self._connection = conf_data.get('connection', None)
  307.         self._LPTasks__added = []
  308.         list.__init__(self)
  309.  
  310.     
  311.     def __repr__(self):
  312.         return '<InfoTable>'
  313.  
  314.     
  315.     def __str__(self):
  316.         if not len(self) > 1 or '[%s]':
  317.             pass
  318.         x = '%s'
  319.         return x % ','.join((lambda .0: for i in .0:
  320. str(i))(self))
  321.  
  322.     
  323.     def addTask(self, task):
  324.         if not isinstance(task, LPTask):
  325.             raise TypeError, "task has to be instance of 'LPTask'"
  326.         isinstance(task, LPTask)
  327.         self._LPTasks__added.append(task)
  328.         self.append(task)
  329.  
  330.     
  331.     def remove(self, item):
  332.         if item not in self._LPTasks__added:
  333.             raise RuntimeError, 'LP does not allow to remove Tasks'
  334.         item not in self._LPTasks__added
  335.         list.remove(self, item)
  336.  
  337.     
  338.     def parse(self):
  339.         pass
  340.  
  341.     re_url = re.compile('^(/([a-z0-9-]+)/([a-z0-9-]+)?/?\\+source)?/([a-z0-9-]+)/\\+bug/.*$')
  342.     
  343.     def current_from_url(url):
  344.         ''' returns (<distibution>,<release>,<product>) or False '''
  345.         x = LPTasks.re_url.search(urlparse.urlsplit(url)[2])
  346.         if x:
  347.             return x.groups()[1:]
  348.         return False
  349.  
  350.     current_from_url = staticmethod(current_from_url)
  351.     re_listurl = re.compile('^(/([a-z0-9\\-\\.]+)/([a-z0-9\\-\\.]+)?/?\\+source)?/([a-z0-9\\-\\.]+)/?(\\+bugs)?$')
  352.     
  353.     def current_from_listurl(url):
  354.         ''' returns (<distibution>,<release>,<product>) or False '''
  355.         x = LPTasks.re_listurl.search(urlparse.urlsplit(url)[2])
  356.         if x:
  357.             return x.groups()[1:-1]
  358.         return False
  359.  
  360.     current_from_listurl = staticmethod(current_from_listurl)
  361.     
  362.     def get_current(self):
  363.         if self._current == None:
  364.             raise AttributeError, 'There is no row of the info-table linked to this bugreport (%s)' % self._url
  365.         self._current == None
  366.         if not isinstance(self._current, int):
  367.             raise AssertionError, 'No task related to %s?' % self._url
  368.         return self[self._current]
  369.  
  370.     current = property(get_current, doc = 'get the info-object for the current bug')
  371.     
  372.     def has_target(self, target):
  373.         if not target:
  374.             return [] in [ i.target for i in self ]
  375.         target = target.lower()
  376.         for i in self:
  377.             if i.target:
  378.                 if i.target.lower() == target:
  379.                     return True
  380.                 continue
  381.             i.target.lower() == target
  382.         
  383.         return False
  384.  
  385.     
  386.     def changed(self):
  387.         ret = list()
  388.         for i in self:
  389.             if i in self._LPTasks__added:
  390.                 ret.append(change_obj(i, 'added'))
  391.                 continue
  392.             if i.changed:
  393.                 ret.append(change_obj(i))
  394.                 continue
  395.         
  396.         return ret
  397.  
  398.     changed = property(changed)
  399.     
  400.     def commit(self, force_changes = False, ignore_lp_errors = True):
  401.         ''' delegates commit() to each changed element '''
  402.         for i in self.changed:
  403.             if i.action == 'added':
  404.                 self._LP_create_task(i, force_changes, ignore_lp_errors)
  405.                 continue
  406.             i.component.commit(force_changes, ignore_lp_errors)
  407.         
  408.  
  409.     
  410.     def _LP_create_task(task, force_changes, ignore_lp_errors):
  411.         raise NotImplementedError
  412.  
  413.  
  414. if __name__ == '__main__':
  415.     for i in ('https://launchpad.net/bugs/12345', 'https://bugs.edge.launchpad.net/bughelper/+bug/152499', 'https://bugs.edge.launchpad.net/ubuntu/+source/bughelper/+bug/107735', 'https://bugs.edge.launchpad.net/ubuntu/feisty/+source/bughelper/+bug/109213', 'https://bugs.edge.launchpad.net/ubuntu/+source/python-launchpad-bugs/+bug/153842'):
  416.         print i, '\t\t', LPTasks.current_from_url(i)
  417.     
  418.  
  419.